﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Noris.Schedule.Support.Services;
using Noris.Schedule.Support;

namespace Noris.Schedule.UI.Services
{
    /// <summary>
    /// Funkce pro otevření okna konfigurace textů elementu
    /// </summary>
    internal class ConfigElementText : IFunctionMenuItem
    {
        #region IFunctionMenuItem Members
        /// <summary>
        /// Tady funkce deklaruje, pro které případy chce být vidět v nabídce.
        /// A pokud ano, tak jak se jmenuje, kde v nabídce je a jaký má obrázek.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        bool IFunctionMenuItem.IsFunctionSuitableFor(FunctionMenuItemSuitableArgs args)
        {
            // Tato funkce je zobrazovaná pro všechny elementy:
            bool isSuitable = args.KeyAreaType == FunctionMenuItemAreaType.GraphElement;
            
            if (isSuitable)
            {
                args.MenuCaption = "Konfigurace textů";
				args.MenuToolTipText = "Umožní nadefinovat texty tohoto prvku (texty v grafu, texty v informativním okně).";
                args.MenuImage = Noris.Schedule.Schedule.Pics.PicLibrary22.Configure2_FromFile;
				args.MenuGroup = "ZZ_CONFIG";
				args.MenuOrder = 1800;
				args.EnabledStateDependingOnElement = true;     // Enable závisí na stavu vybraných elementů
			}
			return isSuitable;
        }
        bool IFunctionMenuItem.IsMenuItemEnabledFor(FunctionMenuItemRunArgs args)
        {
            IConfiguredText elementText;
            if (!TryGetIConfiguredText(args, out elementText))
                return false;

            return IsElementConfigurable(elementText);
        }
        void IFunctionMenuItem.Run(FunctionMenuItemRunArgs args)
        {
            IConfiguredText elementText;
            if (!TryGetIConfiguredText(args, out elementText))
                return;

            if (!IsElementConfigurable(elementText)) return;

            this._RunConfigureText(args, elementText);
        }
        #endregion
        #region Pracovní metody
        private void _RunConfigureText(FunctionMenuItemRunArgs args, IConfiguredText elementText)
        {
            using (EditExpressionForm editForm = new EditExpressionForm())
            {
                // Nejprve nastavím reference na data (element a datový zdroj), to samo o sobě nic nenačítá:
                editForm.SampleConfiguredText = elementText;                      // Přes tento element se budou testovat zadané vzorce!
                editForm.CurrentDataSource = args.DataSource as IEvaluationDataSource;   // Nevyhodí chybu. Ale pokud datový zdroj grafu implementuje IEvaluationDataSource, pak se bude používat pro vyhodnocování vzorce.
                editForm.ClassTreeExtender = args.DataSource as IClassTreeExtender;      //  dtto. Datový zdroj se může používat i jako ClassTreeExtender.

                // Teprve potom nastavím RootClass a ConfigurationKey, zde dojde k načtení dat a k jejich evaluaci:
                editForm.RootClassNumber = elementText.RootClassNumber;           // Nyní se inicializuje strom tříd pro tuto Root třídu do Formu do ClassTree
                editForm.ConfigurationKey = elementText.ConfigurationKey;         // Nyní se načtou konfigurované texty z databáze do Formu
                Steward.ExecuteInTryCatch(delegate { editForm.ShowDialog(Steward.MainForm); }, "");
            }
        }
        private bool TryGetIConfiguredText(FunctionMenuItemRunArgs args, out IConfiguredText elementText)
        {
            elementText = null;

            IDataElement element = args.FindElement(args.ClickedItem);
            if (!(element is IConfiguredText)) return false;

            elementText = element as IConfiguredText;
            return (elementText != null);
        }
        private bool IsElementConfigurable(IConfiguredText elementText)
        {
            return ((elementText.EnabledCaptionTextConfigure || elementText.EnabledToolTipTextConfigure) && !String.IsNullOrEmpty(elementText.ConfigurationKey) && elementText.RootClassNumber > 0);
        }
        #endregion
    }
}
